﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Owin;
using CorreoSocialWeb.Models;

using Subgurim.Controles;
using Subgurim.Controles.GoogleChartIconMaker;

using CorreoSocialWeb.Controls;

namespace CorreoSocialWeb.Views
{
    public class FormViewRutaControlHelper : ControlHelper, IRutaFormEditFields
    {
        protected EditarRutaUserControl Control { get; set; }

        public FormViewRutaControlHelper(EditarRutaUserControl control)
            : base(control)
        {
            this.Control = control;
        }

        protected override Control ParentControl
        {
            get { return this.Control.PanelForm; }
        }

        public string Origen
        {
            get
            {
                return this.FindControl<TextBox>("Origen").Text;
            }
        }

        public string Notas
        {
            get
            {
                return this.FindControl<TextBox>("Notas").Text;
            }
        }

        public string Destino
        {
            get
            {
                return this.FindControl<TextBox>("Destino").Text;
            }
        }

        public int? HoraDeLlegada
        {
            get
            {
                return new HoraValidator().Get(this.FindControl<TextBox>("HoraDeLlegada").Text);
            }
        }

        public string MinutosDeLlegadaString
        {
            get
            {
                return this.FindControl<TextBox>("MinutosDeLlegada").Text;
            }
        }

        public bool MinutosDeLlegadaInvalidos
        {
            get
            {
                return !(new MinutoValidator().Validate(this.MinutosDeLlegadaString));
            }
        }

        public int? MinutosDeLlegada
        {
            get
            {
                return new MinutoValidator().Get(this.MinutosDeLlegadaString);
            }
        }

        public int? HoraDeSalida
        {
            get
            {
                return new HoraValidator().Get(this.FindControl<TextBox>("HoraDeSalida").Text);
            }
        }

        public string MinutosDeSalidaString
        {
            get
            { 
                return this.FindControl<TextBox>("MinutosDeSalida").Text;
            }
        }

        public bool MinutosDeSalidaInvalidos
        {
            get
            {
                return !(new MinutoValidator().Validate(this.MinutosDeSalidaString));
            }
        }

        public int? MinutosDeSalida
        {
            get
            {
                return new MinutoValidator().Get(this.FindControl<TextBox>("MinutosDeSalida").Text);
            }
        }

        public int TamanoDePaqueteId
        {
            get
            {
                return int.Parse(this.FindControl<DropDownList>("TamanoDePaquete").SelectedValue);
            }
        }

        public bool Lunes
        {
            get
            {
                return this.FindControl<CheckBox>("Lunes").Checked;
            }
        }

        public bool Martes
        {
            get
            {
                return this.FindControl<CheckBox>("Martes").Checked;
            }
        }

        public bool Miércoles
        {
            get
            {
                return this.FindControl<CheckBox>("Miercoles").Checked;
            }
        }

        public bool Jueves
        {
            get
            {
                return this.FindControl<CheckBox>("Jueves").Checked;
            }
        }

        public bool Viernes
        {
            get
            {
                return this.FindControl<CheckBox>("Viernes").Checked;
            }
        }

        public bool Sábado
        {
            get
            {
                return this.FindControl<CheckBox>("Sabado").Checked;

            }
        }

        public bool Domingo
        {
            get
            {
                return this.FindControl<CheckBox>("Domingo").Checked;
            }
        }

        public bool Activa
        {
            get
            {
                return this.FindControl<CheckBox>("Activa").Checked;
            }
        }

        public bool SinOrigen
        {
            get
            {
                return string.IsNullOrWhiteSpace(this.Origen);
            }
        }

        public bool SinDestino
        {
            get
            {
                return string.IsNullOrWhiteSpace(this.Destino);
            }
        }

        public bool HoraSalidaInvalida
        {
            get
            {
                return this.SinHoraSalida || this.MinutosDeSalidaInvalidos;
            }
        }

        public bool HoraLlegadaInvalida
        {
            get
            {
                return this.SinHoraLlegada || this.MinutosDeLlegadaInvalidos;
            }
        }

        public bool SinTamanioDePaquete
        {
            get
            {
                return this.TamanoDePaqueteId < 1;
            }
        }

        public bool SinDisponibilidad
        {
            get
            {
                return !this.Lunes
                    & !this.Martes
                    & !this.Miércoles
                    & !this.Jueves
                    & !this.Viernes
                    & !this.Sábado
                    & !this.Domingo;
            }
        }

        public bool SinHoraSalida
        {
            get
            {
                return this.HoraDeSalida == null;
            }
        }

        public bool SinHoraLlegada
        {
            get
            {
                return this.HoraDeLlegada == null;
            }
        }

        public bool SinMinutosDeLlegada
        {
            get
            {
                return this.MinutosDeLlegada == null;
            }
        }

        public bool SinMinutosDeSalida
        {
            get
            {
                return this.MinutosDeSalida == null;
            }
        }

        public bool Validar(ErroresHelper errores)
        {
            if (this.SinOrigen)
                errores.Add("Especificá el Nombre del Origen.", this.Control.LabelErrorOrigen);

            if (this.SinDestino)
                errores.Add("Especificá el Nombre del Destino.\n", this.Control.LabelErrorDestino);

            if (this.SinTamanioDePaquete)
                errores.Add("Especificá el Tamaño de Paquete Máximo.\n", this.Control.LabelErrorTamanoDePaquete);

            if (this.HoraSalidaInvalida)
                errores.Add("Especificá el Horario de Salida.\n", this.Control.LabelErrorHorarioDeSalida);

            if (this.HoraLlegadaInvalida)
                errores.Add("Especificá el Horario de Llegada.\n", this.Control.LabelErrorHorarioDeLlegada);

            if (this.SinDisponibilidad)
                errores.Add("Especificá Disponibilidad de al menos un día de la semana.\n", this.Control.LabelErrorDisponibilidad);

            if (this.CoordenadasDeSesion.SinOrigen)
                errores.Add("Especificá el Punto Origen en el Mapa.\n", this.Control.LabelErrorCoordenadaOrigen);

            if (this.CoordenadasDeSesion.SinDestino)
                errores.Add("Especificá el Punto Destino en el Mapa.\n", this.Control.LabelErrorCoordenadaDestino);

            return !errores.HayErrores;
        }
    }
}